КУРСОВАЯ РАБОТА

 по дисциплине «Микропроцессоры и интерфейсные средства транспортных средств»

на тему «Разработать блок-схему алгоритма, программу на языке ассемблера

 МП КР580ВМ80А и в машинных кодах для решения конкретной задачи»

Вариант № 12

 

СОДЕРЖАНИЕ

ВВЕДЕНИЕ……………………………………………………………………2

1. Сортировка по убыванию всех четных чисел с учетом их модулей…….3

1.1. Выборка четных чисел……………………………………………………3

1.2. Определение модулей четных чисел…………………………………….8

Список литературы……………………………………………………………..15

 ВВЕДЕНИЕ

 

Курсовая работа по дисциплине «Микропроцессоры и интерфейсные средства транспортных средств» заключается в написании программы на языке ассемблера КР580ВМ80. Задание формируется в зависимости от сложности для массива и включает в простейшем случае два пункта:

1) сортировка массива чисел по убыванию (возрастанию);

2) нахождение среднего арифметического чисел для всего массива или его части.

Упорядочить массив из 12 1-байтовых чисел со знаком, расположив четные числа в порядке убывания модуля, найти среднее арифметическое четных чисел

1) выполнить сортировку по убыванию всех четных чисел

с учетом их модулей;

2) найти среднее арифметическое всех чисел.

Разобьем данные задачи на более простые подцели:

1. Выполнить сортировку по убыванию всех четных чисел

Advertisement
Узнайте стоимость Online
  • Тип работы
  • Часть диплома
  • Дипломная работа
  • Курсовая работа
  • Контрольная работа
  • Решение задач
  • Реферат
  • Научно - исследовательская работа
  • Отчет по практике
  • Ответы на билеты
  • Тест/экзамен online
  • Монография
  • Эссе
  • Доклад
  • Компьютерный набор текста
  • Компьютерный чертеж
  • Рецензия
  • Перевод
  • Репетитор
  • Бизнес-план
  • Конспекты
  • Проверка качества
  • Единоразовая консультация
  • Аспирантский реферат
  • Магистерская работа
  • Научная статья
  • Научный труд
  • Техническая редакция текста
  • Чертеж от руки
  • Диаграммы, таблицы
  • Презентация к защите
  • Тезисный план
  • Речь к диплому
  • Доработка заказа клиента
  • Отзыв на диплом
  • Публикация статьи в ВАК
  • Публикация статьи в Scopus
  • Дипломная работа MBA
  • Повышение оригинальности
  • Копирайтинг
  • Другое
Прикрепить файл
Рассчитать стоимость

с учетом их модулей.

1.1. Выборка четных чисел.

1.2. Определение модулей четных чисел.

1. Сортировка по убыванию всех четных чисел с учетом их модулей 

 1.1. Выборка четных чисел

Для начала рассмотрим анализ четности числа на примере однобайтовых чисел. Четность числа в любой системе счисления можно определить путем деления числа на 12. В этом случае если остаток от деления равен нулю, то число четное, если нет – не четное. Для чисел, записанных в двоичной системе, четность можно еще определить по наличию 1 в нулевом разряде байта, т.е. если там записана 12, то число нечетное, если там 0 – четное: число 0512 = 000001122 – нечетное, т.к. в младшем разряде записана 12

7    6    5   4     3   2    1    0

0 0 0 0 0 1 1 2

1
число 0812 =000010001 – четное, т.к. в младшем разряде записан 0

7    6    5   4     3   2    1    0

0 0 0 0 1 0 0 0

1
На языке ассемблера проверить число на четность можно путем маскирования битов. В нашем случае для проверки наличия 1 в младшем разряде необходимо выполнить операцию логического умножения проверяемого числа на число0112 = 000000012. Это можно сделать с помощью команды ANI 01, например, для чисел 0812 и 05120800) ANI 01

Адрес/регистр Код до выполнения операции Код после выполнения операции
0800 E6 E6
0801 01 01
А 0812 =000010001 0012=000000001
FL 02 46 (Флаг Tz=1)
PC 0800 0802

0802) ANI 01

Адрес/регистр Код до выполнения операции Код после выполнения операции
0802 E6 E6
0803 01 01
А 0512 =0000001121 0112=0000000011
FL 02 02 (Флаг Tz=1)
PC 0800 0802

 

Здесь следует обратить внимание на состояние флага нулевого результата Tz. Если он равен 1, то число четное, если же он равен 0 – нечетное. Другой способ анализа четности числа состоит сдвиге этого числа вправо на один разряд (с помощью команды RAR, либо RRC) с последующим анализом флага Tc. Если Tc = 1, то число нечетное, если Tc = 0 – четное. Приведем пример для чисел 0412 и 0712 с использованием команды RAR:

С

 

-А 7         ….                 А0

0804) RAR

Адрес/регистр Код до выполнения операции Код после выполнения операции
0804 1F 1F
А 0412 =0000001001 0012=000000102
FL 02 03 (Флаг Tc=0)
PC 0804 0805

0805) RAR

Адрес/регистр Код до выполнения операции Код после выполнения операции
0805 1F 1F
А 0512 =000001111 0112=100000111
FL 03 03 (Флаг Tc=1)
PC 0805 0806

Для обработки массива чисел нужно указать адрес первогочисла массива. Это можно сделать, например, с помощью ко мандыlxi b, 0A00. Здесь адрес 0А00 – адрес первого элемента, записанный в регистровой паре BC. Пусть четное число будет выписано в отдельный массив с адресом первого элемента 0А30, для этого используем команду lxi d, 0A30. Поскольку нам пред стоит обработать 15 чисел, то разумнее всего будет организовать цикл, который на каждой своей итерации будет проверять одно число из массива на четность. Условием выхода из цикла будет достижение последнего числа массива (или адреса 0A0F Одновременно будем вести подсчет количества четных чисел (это нам пригодится позднее). Ниже приведены блок-схема алгоритма (рис) и листинг программы для массива однобайтовых чисел.

 

Начало

выполнение

программы

 

 

 

Загрузка адреса первого

элемента массива

 

Загрузка адреса первого

элемента массива нечетных чисел (куда будем сохранять)

 

Загрузка числа из массива в

аккумулятор

 

Число четное

 

Переход к следующему

числу в исходном массиве

 

Проверка окончания цикла

 

Уменьшение счетчика четных чисел на 1

 

Число нечетное

 

Наложение маски 01

 

Проверка флага Tz

 

Проверка окончания цикла

 

Копирование числа в массив четных чисел

 

Tz=1?

 

Конец массива

достигнут?

 

Конец массива

достигнут?

 

Переход к следующему

числу в исходном массиве

 

Конец выполнения

программы

 

да
нет
да
нет
да
нет
 

 

 

 

 

 

 

 

 

 

 

 

Метка Мнемоника Комментарий
  lxi b, 0A00 Загрузка начальных адресов
  lxi d, 0A30
Label2:    
 

 

ldax b Загрузка числа из исходного массива в аккумулятор
  ani 01 Проверка на четность (если нечетно, то переходим на Label1, если четно – выполняем следующую команду)
  jnz Label1
  ldax b Пересохраняем на новый адрес, если число четное
  stax d
  inx d Увеличиваем адрес для перехода к следующему элементу массива
  lda 0AA0 Загружаем счетчик четных чисел с адреса 0AA0
  adi 01 Увеличиваем счетчик четных чисел на 1 и сохраняем его по адресу0AA0
  sta 0AA0
Label1:    
  inx b Увеличиваем адрес для перехода к следующему элементу массива
  mvi a, 0F Проверяем окончание цикла, если адрес в регистре C < 0F, то продолжаем выполнение цикла, если C=0F – прекращаем выполнение

программы

  sub c
  jnz Label2
  rst1  

1.2. Определение модулей четных чисел

Модуль числа x – неотрицательное число, обозначаемое |x| и определяемое следующим образом: 1) если x ≥ 0, то |x| = x; 2) если x < 0, то |x| = –x.

Другими словами, модуль числа – это число, взятое без знака. В двоичной системе, как это уже было описано выше, знак определяется наличием 1 в старшем разряде числа. Следовательно, для однобайтовых чисел максимальное положительное число – 7F12 = 011111112, а минимальное отрицательное –8112 = 100000012.

Так как модуль – число неотрицательное, то для любого отрицательного числа нужно получить его значение без знака (его прямой код). Для этого необходимо отрицательное число, пред ставленное в обратном дополнительном коде, про инвертировать и прибавить к нему единицу, например: число 8116 = 100000012, после инвертирования получим011111102, теперь прибавим к результату 1: 2

011111102+000000012011111112 → 011111112 = 7F12, т.е. число 7F12 и есть модуль числа 8112, или по-другому число8112, взятое без знака. Таким образом, для получения модуля числа требуется выполнить 3 условия: 1) определить знак числа; 2) если число отрицательное, то получить его абсолютное значение (значение без знака); Как определить знак числа, было рассмотрено выше, поэтому остановимся подробнее на вычислении модуля. На языке ассемблера инвертирование числа можно осуществить с помощью команды CMA, а прибавление 1 с помощью команды ADI 01. Например, получим модуль числа C4:

 

Адрес/регистр Код до выполнения операции Код после выполнения операции
0804 2F 2F
А C416 =110001002 3B16=001110112
FL 02 02
PC 0806 0807

0807) ANI 01

Адрес/регистр Код до выполнения операции Код после выполнения операции
0807 С6 С6
0808 01 01
А 3B16=001110112 3C16=001111002
FL 02 06
PC 0807 0809

Листинг программы

lxi h,0A30h
    mvi c,0D0h
    xra a
fill:   mov m,a
    inx h
    dcr c
    jnz fill
    lxi b,0A00h
    lxi d,0A30h
    lxi h,000ch
label1: ldax b
    ani 01
    jnz label2
    ldax b
    stax d
    inx d
    inr h
label2: inx b
    dcr l
    jnz label1
    mov a,h
    sta 0aa0h
    ana a
    jz ex

    lxi b,0a30h
    lxi d,0a50h
label11:    ldax b
    ana a
    jp label12
    cpi 80h
    jz label13
    cma
    inr a
    jmp label12
label13:    mvi a,00
label12:    stax d
    inx b
    inx d
    dcr h
    jnz label11
    lda 0aa0h
    cpi 2
    jc label21
    sta 0a70h
label22:    lda 0aa0h
    mov l,a
    lda 0a70h
    dcr a
    sta 0a70h
    jz label21
    lxi b, 0A50h
    lxi d, 0A30h
label23:    dcr l
    jz label22
    ldax b
    mov h, a
    inx b
    ldax b
    cmp h
    inx d
    jc label23
    dcx b
    stax b
    inx b
    mov a, h
    stax b
    dcx d
    ldax d
    mov h, a
    inx d
    ldax d
    dcx d
    stax d
    inx d
    mov a, h
    stax d
    jmp label23

label21:    lxi b,0a30h
    lxi h,0
    lda 0aa0h
    mov d,a
label31:    ldax b
    ana a
    jp label32
    add l
    mov l,a
    mov a,h
    aci 0ffh
    mov h,a
    jmp label33
label32:    add l
    mov l,a
    mov a,h
    aci 00
    mov h,a
label33:    inx b
    dcr d
    jnz label31
    shld 0AF0h

skip:   lda 0af1h
    ani 80h
    jz div1
    mvi a,0ffh
    sta 0af3h
    lxi h,0af0h
    call neg
div1:   mvi c, 00
    lda 0aa0h
    mov d,a
    lda 0AF1h
    mov e,a
    call div
    mov a, h
    sta 0AF9h
    lda 0AF0h
    mov e, a
    call div
    mov a, h
    sta 0AF8h
    mov a,c
    sta 0AF7h
    lda 0AF3h
    cpi 0FFh
    jnz ex
    lxi h,0af8h
    call neg
ex: rst 1

neg:    mov a,m
    cma
    adi 01
    mov m,a
    inx h
    mov a,m
    cma
    aci 00
    mov m,a
    ret

div:    lxi h,0008
div3:   mov a, e
    ral
    mov e, a
    mov a, c
    ral
    sub d
    jnc div2
    add d
div2:   mov c, a
    cmc
    mov a, h
    ral
    mov h, a
    dcr l
    jnz div3
    ret

Список литературы

 

1. Палагута К.А. Микропроцессоры INTEL 8080, 8085(КР580ВМ80А, КР1821М85А) и их программирование. – М.:МГИУ, 2007. – 104 с.